--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sbapp/md2bbcode/html2bbcode.py 0a28ec76f3ea7549bd103e1fa09b69267541dbb7 (0a28ec76) Text, 5.40 KB
T8b949e# converts some HTML tags to BBCode
T8b949e# pass --debug to save the output to readme.finalpass
T8b949e# may be better off replacing this with html to markdown (and then to bbcode). Lepture recommeds a JS html to markdown converter: sundown
Tff7b72from T7ee787bs4 Tff7b72import Te6edf3BeautifulSoupTb4b4b4, Te6edf3NavigableString
Tff7b72import T7ee787argparse
Tff7b72def Td2a8ffhandle_font_tagTb4b4b4(Te6edf3tagTb4b4b4, Te6edf3replacementsTb4b4b4)Tb4b4b4:
T8b949e"""Handles the conversion of <font> tag with attributes like color and size."""
Te6edf3attributes Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Ta5d6ff'Ta5d6ffcolorTa5d6ff' Tff7b72in Te6edf3tagTff7b72.Td2a8ffattrsTb4b4b4:
Te6edf3attributesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCOLOR=Tffd700{Te6edf3tagTb4b4b4[Ta5d6ff'Ta5d6ffcolorTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff'Ta5d6ffsizeTa5d6ff' Tff7b72in Te6edf3tagTff7b72.Td2a8ffattrsTb4b4b4:
Te6edf3attributesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSIZE=Tffd700{Te6edf3tagTb4b4b4[Ta5d6ff'Ta5d6ffsizeTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff'Ta5d6fffaceTa5d6ff' Tff7b72in Te6edf3tagTff7b72.Td2a8ffattrsTb4b4b4:
Te6edf3attributesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFONT=Tffd700{Te6edf3tagTb4b4b4[Ta5d6ff'Ta5d6fffaceTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
Te6edf3inner_content Tff7b72= Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3recursive_html_to_bbcodeTb4b4b4(Te6edf3childTb4b4b4, Te6edf3replacementsTb4b4b4) Tff7b72for Te6edf3child Tff7b72in Te6edf3tagTff7b72.Td2a8ffchildrenTb4b4b4)
Tff7b72if Te6edf3attributesTb4b4b4:
T8b949e# Nest all attributes. Example: [COLOR=red][SIZE=5]content[/SIZE][/COLOR]
Tff7b72for Te6edf3attr Tff7b72in Tffa657reversedTb4b4b4(Te6edf3attributesTb4b4b4)Tb4b4b4:
Te6edf3inner_content Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[Tffd700{Te6edf3attrTffd700}Ta5d6ff]Tffd700{Te6edf3inner_contentTffd700}Ta5d6ff[/Tffd700{Te6edf3attrTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff=Ta5d6ff'Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tffd700}Ta5d6ff]Ta5d6ff"
Tff7b72return Te6edf3inner_content
Tff7b72def Td2a8ffhandle_style_tagTb4b4b4(Te6edf3tagTb4b4b4, Te6edf3replacementsTb4b4b4)Tb4b4b4:
T8b949e"""Handles the conversion of tags with style attributes like color, size, and font."""
Te6edf3attributes Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3style Tff7b72= Te6edf3tagTff7b72.Td2a8ffattrsTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff'Ta5d6ffstyleTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff'Tb4b4b4)
T8b949e# Extracting CSS properties
Te6edf3css_properties Tff7b72= Tb4b4b4{Te6edf3itemTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff:Ta5d6ff'Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3itemTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff:Ta5d6ff'Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]Tff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3item Tff7b72in Te6edf3styleTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff;Ta5d6ff'Tb4b4b4) Tff7b72if Ta5d6ff'Ta5d6ff:Ta5d6ff' Tff7b72in Te6edf3itemTb4b4b4}
T8b949e# Mapping CSS properties to BBCode
Tff7b72if Ta5d6ff'Ta5d6ffcolorTa5d6ff' Tff7b72in Te6edf3css_propertiesTb4b4b4:
Te6edf3attributesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffCOLOR=Tffd700{Te6edf3css_propertiesTb4b4b4[Ta5d6ff'Ta5d6ffcolorTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff'Ta5d6fffont-sizeTa5d6ff' Tff7b72in Te6edf3css_propertiesTb4b4b4:
Te6edf3attributesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffSIZE=Tffd700{Te6edf3css_propertiesTb4b4b4[Ta5d6ff'Ta5d6fffont-sizeTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff'Ta5d6fffont-familyTa5d6ff' Tff7b72in Te6edf3css_propertiesTb4b4b4:
Te6edf3attributesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffFONT=Tffd700{Te6edf3css_propertiesTb4b4b4[Ta5d6ff'Ta5d6fffont-familyTa5d6ff'Tb4b4b4]Tffd700}Ta5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff'Ta5d6fftext-decorationTa5d6ff' Tff7b72in Te6edf3css_properties Tff7b72and Ta5d6ff'Ta5d6ffline-throughTa5d6ff' Tff7b72in Te6edf3css_propertiesTb4b4b4[Ta5d6ff'Ta5d6fftext-decorationTa5d6ff'Tb4b4b4]Tb4b4b4:
Te6edf3attributesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffSTa5d6ff"Tb4b4b4) T8b949e# Assume strike-through
Tff7b72if Ta5d6ff'Ta5d6fftext-decorationTa5d6ff' Tff7b72in Te6edf3css_properties Tff7b72and Ta5d6ff'Ta5d6ffunderlineTa5d6ff' Tff7b72in Te6edf3css_propertiesTb4b4b4[Ta5d6ff'Ta5d6fftext-decorationTa5d6ff'Tb4b4b4]Tb4b4b4:
Te6edf3attributesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffUTa5d6ff"Tb4b4b4)
Tff7b72if Ta5d6ff'Ta5d6fffont-weightTa5d6ff' Tff7b72in Te6edf3css_propertiesTb4b4b4:
Tff7b72if Te6edf3css_propertiesTb4b4b4[Ta5d6ff'Ta5d6fffont-weightTa5d6ff'Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ff'Ta5d6ffboldTa5d6ff' Tff7b72or Tb4b4b4(Te6edf3css_propertiesTb4b4b4[Ta5d6ff'Ta5d6fffont-weightTa5d6ff'Tb4b4b4]Tff7b72.Td2a8ffisdigitTb4b4b4(Tb4b4b4) Tff7b72and Tffa657intTb4b4b4(Te6edf3css_propertiesTb4b4b4[Ta5d6ff'Ta5d6fffont-weightTa5d6ff'Tb4b4b4]Tb4b4b4) Tff7b72>Tff7b72= T79c0ff700Tb4b4b4)Tb4b4b4:
Te6edf3attributesTff7b72.Td2a8ffappendTb4b4b4(Ta5d6ff"Ta5d6ffBTa5d6ff"Tb4b4b4) T8b949e# Assume bold
Te6edf3inner_content Tff7b72= Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Te6edf3recursive_html_to_bbcodeTb4b4b4(Te6edf3childTb4b4b4, Te6edf3replacementsTb4b4b4) Tff7b72for Te6edf3child Tff7b72in Te6edf3tagTff7b72.Td2a8ffchildrenTb4b4b4)
Tff7b72if Te6edf3attributesTb4b4b4:
T8b949e# Nest all attributes
Tff7b72for Te6edf3attr Tff7b72in Tffa657reversedTb4b4b4(Te6edf3attributesTb4b4b4)Tb4b4b4:
Tff7b72if Ta5d6ff'Ta5d6ff=Ta5d6ff' Tff7b72in Te6edf3attrTb4b4b4: T8b949e# For attributes with values
Te6edf3inner_content Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[Tffd700{Te6edf3attrTffd700}Ta5d6ff]Tffd700{Te6edf3inner_contentTffd700}Ta5d6ff[/Tffd700{Te6edf3attrTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff'Ta5d6ff=Ta5d6ff'Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tffd700}Ta5d6ff]Ta5d6ff"
Tff7b72elseTb4b4b4: T8b949e# For simple BBCode tags like [B], [I], [U], [S]
Te6edf3inner_content Tff7b72= Ta5d6fffTa5d6ff"Ta5d6ff[Tffd700{Te6edf3attrTffd700}Ta5d6ff]Tffd700{Te6edf3inner_contentTffd700}Ta5d6ff[/Tffd700{Te6edf3attrTffd700}Ta5d6ff]Ta5d6ff"
Tff7b72return Te6edf3inner_content
Tff7b72def Td2a8ffrecursive_html_to_bbcodeTb4b4b4(Te6edf3elementTb4b4b4)Tb4b4b4:
T8b949e"""Recursively convert HTML elements to BBCode."""
Te6edf3bbcode Tff7b72= Ta5d6ff'Ta5d6ff'
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3elementTb4b4b4, Te6edf3NavigableStringTb4b4b4)Tb4b4b4:
Te6edf3bbcode Tff7b72+Tff7b72= Tffa657strTb4b4b4(Te6edf3elementTb4b4b4)
Tff7b72elif Te6edf3elementTff7b72.Td2a8ffname Tff7b72== Ta5d6ff'Ta5d6ffdetailsTa5d6ff'Tb4b4b4:
T8b949e# Handle <details> tag
Te6edf3summary Tff7b72= Te6edf3elementTff7b72.Td2a8fffindTb4b4b4(Ta5d6ff'Ta5d6ffsummaryTa5d6ff'Tb4b4b4)
Te6edf3spoiler_title Tff7b72= Ta5d6ff'Ta5d6ff'
Tff7b72if Te6edf3summaryTb4b4b4:
T8b949e# Get the summary content and remove the summary element
Te6edf3spoiler_title Tff7b72= Ta5d6ff'Ta5d6ff=Ta5d6ff' Tff7b72+ Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Te6edf3recursive_html_to_bbcodeTb4b4b4(Te6edf3childTb4b4b4) Tff7b72for Te6edf3child Tff7b72in Te6edf3summaryTff7b72.Td2a8ffcontentsTb4b4b4]Tb4b4b4)
Te6edf3summaryTff7b72.Td2a8ffdecomposeTb4b4b4(Tb4b4b4)
T8b949e# Process remaining content
Te6edf3content Tff7b72= Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Te6edf3recursive_html_to_bbcodeTb4b4b4(Te6edf3childTb4b4b4) Tff7b72for Te6edf3child Tff7b72in Te6edf3elementTff7b72.Td2a8ffcontentsTb4b4b4]Tb4b4b4)
Te6edf3bbcode Tff7b72+Tff7b72= Ta5d6fffTa5d6ff'Ta5d6ff[SPOILERTffd700{Te6edf3spoiler_titleTffd700}Ta5d6ff]Tffd700{Te6edf3contentTffd700}Ta5d6ff[/SPOILER]Ta5d6ff'
Tff7b72elif Te6edf3elementTff7b72.Td2a8ffname Tff7b72== Ta5d6ff'Ta5d6ffsummaryTa5d6ff'Tb4b4b4:
T8b949e# Skip summary tag as it's handled in details
Tff7b72return Ta5d6ff'Ta5d6ff'
Tff7b72elseTb4b4b4:
T8b949e# Handle other tags or pass through
Te6edf3content Tff7b72= Ta5d6ff'Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Te6edf3recursive_html_to_bbcodeTb4b4b4(Te6edf3childTb4b4b4) Tff7b72for Te6edf3child Tff7b72in Te6edf3elementTff7b72.Td2a8ffcontentsTb4b4b4]Tb4b4b4)
Te6edf3bbcode Tff7b72+Tff7b72= Te6edf3content
Tff7b72return Te6edf3bbcode
Tff7b72def Td2a8ffhtml_to_bbcodeTb4b4b4(Te6edf3htmlTb4b4b4)Tb4b4b4:
Te6edf3replacements Tff7b72= Tb4b4b4{
Ta5d6ff'Ta5d6ffbTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffBTa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffstrongTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffBTa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffiTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffITa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffemTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffITa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffuTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffUTa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffsTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffSTa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffsubTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffSUBTa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffsupTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffSUPTa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffpTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff'Tb4b4b4, T8b949e# Handled by default
Ta5d6ff'Ta5d6ffulTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffLISTTa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffolTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffLIST=1Ta5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffliTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff*Ta5d6ff'Tb4b4b4, T8b949e# Special handling in recursive function
Ta5d6ff'Ta5d6fffontTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ff'Tb4b4b4, T8b949e# To be handled for attributes
Ta5d6ff'Ta5d6ffblockquoteTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffQUOTETa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffpreTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffCODETa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffcodeTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffICODETa5d6ff'Tb4b4b4,
Ta5d6ff'Ta5d6ffaTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffURLTa5d6ff'Tb4b4b4, T8b949e# Special handling for attributes
Ta5d6ff'Ta5d6ffimgTa5d6ff'Tb4b4b4: Ta5d6ff'Ta5d6ffIMGTa5d6ff' T8b949e# Special handling for attributes
Tb4b4b4}
Te6edf3soup Tff7b72= Te6edf3BeautifulSoupTb4b4b4(Te6edf3htmlTb4b4b4, Ta5d6ff'Ta5d6ffhtml.parserTa5d6ff'Tb4b4b4)
Tff7b72return Te6edf3recursive_html_to_bbcodeTb4b4b4(Te6edf3soupTb4b4b4)
Tff7b72def Td2a8ffprocess_htmlTb4b4b4(Te6edf3input_htmlTb4b4b4, Te6edf3debugTff7b72=Tff7b72FalseTb4b4b4, Te6edf3output_fileTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3converted_bbcode Tff7b72= Te6edf3html_to_bbcodeTb4b4b4(Te6edf3input_htmlTb4b4b4)
Tff7b72if Te6edf3debugTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3output_fileTb4b4b4, Ta5d6ff'Ta5d6ffwTa5d6ff'Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4) Tff7b72as Te6edf3fileTb4b4b4:
Te6edf3fileTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3converted_bbcodeTb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72return Te6edf3converted_bbcode
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffConvert HTML to BBCode with optional debugging output.Ta5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ffinput_fileTa5d6ff'Tb4b4b4, Tffa657typeTff7b72=Tffa657strTb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffInput HTML file pathTa5d6ff'Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff--debugTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffstore_trueTa5d6ff'Tb4b4b4, Te6edf3helpTff7b72=Ta5d6ff'Ta5d6ffSave output to readme.finalpass for debuggingTa5d6ff'Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Te6edf3input_file Tff7b72= Te6edf3argsTff7b72.Td2a8ffinput_file
Te6edf3output_file Tff7b72= Ta5d6ff'Ta5d6ffreadme.finalpassTa5d6ff' Tff7b72if Te6edf3argsTff7b72.Td2a8ffdebug Tff7b72else Tff7b72None
Tff7b72with Tffa657openTb4b4b4(Te6edf3input_fileTb4b4b4, Ta5d6ff'Ta5d6ffrTa5d6ff'Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff'Ta5d6ffutf-8Ta5d6ff'Tb4b4b4) Tff7b72as Te6edf3fileTb4b4b4:
Te6edf3html_content Tff7b72= Te6edf3fileTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)
T8b949e# Call the processing function
Te6edf3process_htmlTb4b4b4(Te6edf3html_contentTb4b4b4, Te6edf3debugTff7b72=Te6edf3argsTff7b72.Td2a8ffdebugTb4b4b4, Te6edf3output_fileTff7b72=Te6edf3output_fileTb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────